Skip to content

Instantly share code, notes, and snippets.

@james-Ballyhoo
Created April 11, 2022 15:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save james-Ballyhoo/eefe5d4b05ae51184c92ba7359f7004e to your computer and use it in GitHub Desktop.
Save james-Ballyhoo/eefe5d4b05ae51184c92ba7359f7004e to your computer and use it in GitHub Desktop.
Bitbucket full backup script (deno)
/**
* Bitbucket bulk backup script using Deno.
*
* Backs up all the repos in a workspace to a mirror
* note: Use an app password scoped to read repo only
* workspace is the url slug for your username/company/group etc
*
* Should also update existing bare repos that are found.
*
* Released under MIT License, use at own risk
*/
// const USER = "";
// const PASS = ""; // Use an app password with repo read access only
// const WORKSPACE = "";
const exists = (filename) => {
try {
Deno.statSync(filename);
// successful, file or directory must exist
return true;
} catch (error) {
if (error instanceof Deno.errors.NotFound) {
// file or directory does not exist
return false;
} else {
// unexpected error, maybe permissions, pass it along
throw error;
}
}
};
let repos = [];
let url = `https://api.bitbucket.org/2.0/repositories/${WORKSPACE}`;
if(!exists("./repos"))
{
Deno.mkdirSync("./repos");
}
Deno.chdir("./repos");
const baseDir = Deno.cwd();
do {
console.log(url);
const data = await (
await fetch(url, {
headers: { authorization: `basic ${btoa([USER, PASS].join(":"))}` },
})
).json();
for (let entry of data.values.map((r) => ({
name: r.full_name.split("/")[1],
url: r.links.clone.find((m) => m.name == "ssh").href,
}))) {
if (!exists(baseDir + "/" + entry.name + ".git")) {
console.log(`Mirroring ${entry.name}...`);
Deno.chdir(baseDir);
const p = Deno.run({ cmd: ["git", "clone", "--mirror", entry.url] });
await p.status();
} else {
console.log(`Syncing ${entry.name}...`);
Deno.chdir(baseDir + "/" + entry.name + ".git");
const p = Deno.run({ cmd: ["git", "remote", "update"] });
await p.status();
}
}
url = data.next;
} while (url != null);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment