28b9d6e548
Existing "git push --all" is almost perfect for backing up to another repository, except that "--all" only means "all branches" in modern git, and it does not delete old branches and tags that exist at the back-up repository that you have removed from your local repository. This teaches "git-send-pack" a new "--mirror" option. The difference from the "--all" option are that (1) it sends all refs, not just branches, and (2) it deletes old refs you no longer have on the local side from the remote side. Original patch by Junio C Hamano. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
#ifndef REMOTE_H
|
|
#define REMOTE_H
|
|
|
|
struct remote {
|
|
const char *name;
|
|
|
|
const char **url;
|
|
int url_nr;
|
|
|
|
const char **push_refspec;
|
|
struct refspec *push;
|
|
int push_refspec_nr;
|
|
|
|
const char **fetch_refspec;
|
|
struct refspec *fetch;
|
|
int fetch_refspec_nr;
|
|
|
|
/*
|
|
* -1 to never fetch tags
|
|
* 0 to auto-follow tags on heuristic (default)
|
|
* 1 to always auto-follow tags
|
|
* 2 to always fetch tags
|
|
*/
|
|
int fetch_tags;
|
|
|
|
const char *receivepack;
|
|
const char *uploadpack;
|
|
};
|
|
|
|
struct remote *remote_get(const char *name);
|
|
|
|
typedef int each_remote_fn(struct remote *remote, void *priv);
|
|
int for_each_remote(each_remote_fn fn, void *priv);
|
|
|
|
int remote_has_url(struct remote *remote, const char *url);
|
|
|
|
struct refspec {
|
|
unsigned force : 1;
|
|
unsigned pattern : 1;
|
|
|
|
char *src;
|
|
char *dst;
|
|
};
|
|
|
|
struct ref *alloc_ref(unsigned namelen);
|
|
|
|
struct ref *copy_ref_list(const struct ref *ref);
|
|
|
|
int check_ref_type(const struct ref *ref, int flags);
|
|
|
|
/*
|
|
* Frees the entire list and peers of elements.
|
|
*/
|
|
void free_refs(struct ref *ref);
|
|
|
|
/*
|
|
* Removes and frees any duplicate refs in the map.
|
|
*/
|
|
void ref_remove_duplicates(struct ref *ref_map);
|
|
|
|
struct refspec *parse_ref_spec(int nr_refspec, const char **refspec);
|
|
|
|
int match_refs(struct ref *src, struct ref *dst, struct ref ***dst_tail,
|
|
int nr_refspec, const char **refspec, int all);
|
|
|
|
/*
|
|
* Given a list of the remote refs and the specification of things to
|
|
* fetch, makes a (separate) list of the refs to fetch and the local
|
|
* refs to store into.
|
|
*
|
|
* *tail is the pointer to the tail pointer of the list of results
|
|
* beforehand, and will be set to the tail pointer of the list of
|
|
* results afterward.
|
|
*
|
|
* missing_ok is usually false, but when we are adding branch.$name.merge
|
|
* it is Ok if the branch is not at the remote anymore.
|
|
*/
|
|
int get_fetch_map(const struct ref *remote_refs, const struct refspec *refspec,
|
|
struct ref ***tail, int missing_ok);
|
|
|
|
struct ref *get_remote_ref(const struct ref *remote_refs, const char *name);
|
|
|
|
/*
|
|
* For the given remote, reads the refspec's src and sets the other fields.
|
|
*/
|
|
int remote_find_tracking(struct remote *remote, struct refspec *refspec);
|
|
|
|
struct branch {
|
|
const char *name;
|
|
const char *refname;
|
|
|
|
const char *remote_name;
|
|
struct remote *remote;
|
|
|
|
const char **merge_name;
|
|
struct refspec **merge;
|
|
int merge_nr;
|
|
};
|
|
|
|
struct branch *branch_get(const char *name);
|
|
|
|
int branch_has_merge_config(struct branch *branch);
|
|
int branch_merge_matches(struct branch *, int n, const char *);
|
|
|
|
/* Flags to match_refs. */
|
|
enum match_refs_flags {
|
|
MATCH_REFS_NONE = 0,
|
|
MATCH_REFS_ALL = (1 << 0),
|
|
MATCH_REFS_MIRROR = (1 << 1),
|
|
};
|
|
|
|
#endif
|