forge
ExploreLog in

Tahinli/forge

public
0 watching
★ 0
1.8 KiB
1//! Smart-HTTP and SSH service selection and command construction.
2
3use std::path::Path;
4
5use crate::command::{GitCommand, GitEnv};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum GitService {
9 UploadPack,
10 ReceivePack,
11}
12
13impl GitService {
14 /// Accepts `git-upload-pack` or `git-receive-pack`.
15 pub fn from_name(s: &str) -> Option<Self> {
16 match s {
17 "git-upload-pack" => Some(GitService::UploadPack),
18 "git-receive-pack" => Some(GitService::ReceivePack),
19 _ => None,
20 }
21 }
22
23 /// `git-upload-pack` or `git-receive-pack`.
24 pub fn name(&self) -> &'static str {
25 match self {
26 GitService::UploadPack => "git-upload-pack",
27 GitService::ReceivePack => "git-receive-pack",
28 }
29 }
30
31 /// The `git` subcommand, without the `git-` prefix.
32 fn subcommand(&self) -> &'static str {
33 match self {
34 GitService::UploadPack => "upload-pack",
35 GitService::ReceivePack => "receive-pack",
36 }
37 }
38}
39
40/// Builds `git <upload-pack|receive-pack> [--stateless-rpc] [--advertise-refs] -- <repo>`.
41/// `git_protocol` is passed as `GIT_PROTOCOL`. For SSH, pass `stateless_rpc=false` and
42/// `advertise_refs=false` to get no flags.
43pub fn service_command(
44 env: &GitEnv,
45 svc: GitService,
46 repo: &Path,
47 stateless_rpc: bool,
48 advertise_refs: bool,
49 git_protocol: Option<&str>,
50) -> GitCommand {
51 let mut cmd = GitCommand::new(env, svc.subcommand());
52 if stateless_rpc {
53 cmd = cmd.arg("--stateless-rpc");
54 }
55 if advertise_refs {
56 cmd = cmd.arg("--advertise-refs");
57 }
58 let repo_str = repo.to_string_lossy();
59 cmd = cmd.paths(&[repo_str.as_ref()]);
60 if let Some(proto) = git_protocol {
61 cmd = cmd.env("GIT_PROTOCOL", proto);
62 }
63 cmd
64}