1

不知什么时候开始,自家github堆满了仓库代码。。。各种demo开头的项目,还有些空仓库,啥都没写的。自然,程序员写的最差的代码就是以前写的代码了,为了维护心中美好的光辉形象,我决定——————
2015723155143.png

不过,删除过程确实麻烦了些,身为“头脑简单,四肢发达” ,哦不对,“四肢简单,头脑发达”的程序员,怎么会甘心做苦力劳动呢?我决定搞个命令行批量执行下。
图片描述

找到github API文档

要删除当然是要找API啦,不过,我开始想的是用puppeteer无头chrome搞的,后来发现直接有API,就直接用喽。
删除git仓库需要认证权限,我这里直接用Basic Auth验证,简单!Basic验证,简单说就是在请求头里,搞个Authorization:用户名:密码

命令行工具

必须是要美美的命令行优化工具啦,I pick这个inquirer。 有一些带颜色的终端字看着还是ok的,所以还带上了chalk这个库。

just do it

具体的代码,调用API,实在简单,看看就好:

#!/usr/bin/env node

var inquirer = require('inquirer');
var axios = require('axios');
var chalk = require('chalk');
var log = console.log;

var api = {
  user: async () => {
    return await axios({
      url: 'https://api.github.com/user',
      method: 'GET',
    });
  },
  repos: async () => {
    return await axios({
      url: 'https://api.github.com/user/repos',
      method: 'GET',
    });
  },
  deleteRepos: async (user, name) => {
    return await axios({
      method: 'DELETE',
      url: `https://api.github.com/repos/${user}/${name}`,
    });
  },
  login: async () => {
    return await inquirer.prompt([
      {
        name: 'username',
        message: 'username?'
      },
      {
        name: 'password',
        type: 'password',
        message: 'password?'
      }
    ]);
  },
  listRepos: async (repos) => {
    var list = [];
    repos.forEach(v => {
      var desc = v.description === null ? '' : v.description;
      list.push({name: v.full_name + ' ' + desc});
    });
    return await inquirer.prompt([
      {
        type: 'checkbox',
        name: 'rep',
        message: 'select need cleared repos',
        choices: list
      }
    ]);
  }
};

(async () => {
  var inf = await api.login();
  var base64 = new Buffer.from(inf.username + ':' + inf.password).toString('base64');
  axios.interceptors.request.use(config => {
    config.headers = {
      Authorization: 'Basic ' + base64
    };
    return config;
  });
  var user = await api.user();
  log(`welcome ! ${chalk.green(user.data.name || user.data.login)}`);
  var repos = await api.repos();
  var selectRepos = await api.listRepos(repos.data);
  for (var j = 0; j < selectRepos.rep.length; j++) {
    var name = selectRepos.rep[j].indexOf(' ') === -1 ? selectRepos.rep[j] : selectRepos.rep[j].substring(0, selectRepos.rep[j].indexOf(' '));
    await api.deleteRepos(user.data.login, name);
  }
  log(chalk.green('successfull!'));
})();

npm打包发布

就这样打包,肯定不会有全局执行文件滴。

首先你需要在主执行的js的第一行写上

#!/usr/bin/env node

大家都知道,这是linux中指定文件执行解释器的意思,windows系统没用,但是配合上npm就有用啦,且先写着。

然后:在package.json中,敲下如下代码:

 "bin": {
    "ngit": "index.js"
  },

ngit说明全局执行命令叫ngit, index.js是执行文件。

ok,最后npm publish发布

npm install -g nodejs-github

再到cmd中,输入

ngit

就会直接执行代码啦,呼呼呼呼呼呼~~

github: https://github.com/chendonming/nodejs-github
npm: nodejs-github

各位看官阔以看下。


陈东民
2.1k 声望269 粉丝

坚持自我 纯粹的技术