mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-01 22:25:34 +00:00
158 lines
3.3 KiB
C
158 lines
3.3 KiB
C
/*
|
|
* libgit2 "stash" example - shows how to use the stash API
|
|
*
|
|
* Written by the libgit2 contributors
|
|
*
|
|
* To the extent possible under law, the author(s) have dedicated all copyright
|
|
* and related and neighboring rights to this software to the public domain
|
|
* worldwide. This software is distributed without any warranty.
|
|
*
|
|
* You should have received a copy of the CC0 Public Domain Dedication along
|
|
* with this software. If not, see
|
|
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
|
*/
|
|
|
|
#include <stdarg.h>
|
|
|
|
#include "common.h"
|
|
|
|
enum subcmd {
|
|
SUBCMD_APPLY,
|
|
SUBCMD_LIST,
|
|
SUBCMD_POP,
|
|
SUBCMD_PUSH
|
|
};
|
|
|
|
struct opts {
|
|
enum subcmd cmd;
|
|
int argc;
|
|
char **argv;
|
|
};
|
|
|
|
static void usage(const char *fmt, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
fputs("usage: git stash list\n", stderr);
|
|
fputs(" or: git stash ( pop | apply )\n", stderr);
|
|
fputs(" or: git stash [push]\n", stderr);
|
|
fputs("\n", stderr);
|
|
|
|
va_start(ap, fmt);
|
|
vfprintf(stderr, fmt, ap);
|
|
va_end(ap);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
static void parse_subcommand(struct opts *opts, int argc, char *argv[])
|
|
{
|
|
char *arg = (argc < 2) ? "push" : argv[1];
|
|
enum subcmd cmd;
|
|
|
|
if (!strcmp(arg, "apply")) {
|
|
cmd = SUBCMD_APPLY;
|
|
} else if (!strcmp(arg, "list")) {
|
|
cmd = SUBCMD_LIST;
|
|
} else if (!strcmp(arg, "pop")) {
|
|
cmd = SUBCMD_POP;
|
|
} else if (!strcmp(arg, "push")) {
|
|
cmd = SUBCMD_PUSH;
|
|
} else {
|
|
usage("invalid command %s", arg);
|
|
return;
|
|
}
|
|
|
|
opts->cmd = cmd;
|
|
opts->argc = (argc < 2) ? argc - 1 : argc - 2;
|
|
opts->argv = argv;
|
|
}
|
|
|
|
static int cmd_apply(git_repository *repo, struct opts *opts)
|
|
{
|
|
if (opts->argc)
|
|
usage("apply does not accept any parameters");
|
|
|
|
check_lg2(git_stash_apply(repo, 0, NULL),
|
|
"Unable to apply stash", NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int list_stash_cb(size_t index, const char *message,
|
|
const git_oid *stash_id, void *payload)
|
|
{
|
|
UNUSED(stash_id);
|
|
UNUSED(payload);
|
|
printf("stash@{%"PRIuZ"}: %s\n", index, message);
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_list(git_repository *repo, struct opts *opts)
|
|
{
|
|
if (opts->argc)
|
|
usage("list does not accept any parameters");
|
|
|
|
check_lg2(git_stash_foreach(repo, list_stash_cb, NULL),
|
|
"Unable to list stashes", NULL);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_push(git_repository *repo, struct opts *opts)
|
|
{
|
|
git_signature *signature;
|
|
git_commit *stash;
|
|
git_oid stashid;
|
|
|
|
if (opts->argc)
|
|
usage("push does not accept any parameters");
|
|
|
|
check_lg2(git_signature_default(&signature, repo),
|
|
"Unable to get signature", NULL);
|
|
check_lg2(git_stash_save(&stashid, repo, signature, NULL, GIT_STASH_DEFAULT),
|
|
"Unable to save stash", NULL);
|
|
check_lg2(git_commit_lookup(&stash, repo, &stashid),
|
|
"Unable to lookup stash commit", NULL);
|
|
|
|
printf("Saved working directory %s\n", git_commit_summary(stash));
|
|
|
|
git_signature_free(signature);
|
|
git_commit_free(stash);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int cmd_pop(git_repository *repo, struct opts *opts)
|
|
{
|
|
if (opts->argc)
|
|
usage("pop does not accept any parameters");
|
|
|
|
check_lg2(git_stash_pop(repo, 0, NULL),
|
|
"Unable to pop stash", NULL);
|
|
|
|
printf("Dropped refs/stash@{0}\n");
|
|
|
|
return 0;
|
|
}
|
|
|
|
int lg2_stash(git_repository *repo, int argc, char *argv[])
|
|
{
|
|
struct opts opts = { 0 };
|
|
|
|
parse_subcommand(&opts, argc, argv);
|
|
|
|
switch (opts.cmd) {
|
|
case SUBCMD_APPLY:
|
|
return cmd_apply(repo, &opts);
|
|
case SUBCMD_LIST:
|
|
return cmd_list(repo, &opts);
|
|
case SUBCMD_PUSH:
|
|
return cmd_push(repo, &opts);
|
|
case SUBCMD_POP:
|
|
return cmd_pop(repo, &opts);
|
|
}
|
|
|
|
return -1;
|
|
}
|