Allow ignoring certain files from being managed in the git repository. (#3)
parent
09674036bd
commit
07b7ad0a09
|
@ -71,6 +71,9 @@ repos:
|
||||||
name: origin
|
name: origin
|
||||||
branch: master
|
branch: master
|
||||||
url: "https://github.com/owner/repo.git"
|
url: "https://github.com/owner/repo.git"
|
||||||
|
unmanaged:
|
||||||
|
- LICENSE
|
||||||
|
- README.md
|
||||||
packages:
|
packages:
|
||||||
homesync:
|
homesync:
|
||||||
- $HOME/.homesync.yml
|
- $HOME/.homesync.yml
|
||||||
|
|
|
@ -10,6 +10,9 @@ repos:
|
||||||
name: origin
|
name: origin
|
||||||
branch: master
|
branch: master
|
||||||
url: "git@github.com:jrpotter/home-config.git"
|
url: "git@github.com:jrpotter/home-config.git"
|
||||||
|
unmanaged:
|
||||||
|
- LICENSE
|
||||||
|
- README.md
|
||||||
packages:
|
packages:
|
||||||
alacritty:
|
alacritty:
|
||||||
- $HOME/.alacritty.yml
|
- $HOME/.alacritty.yml
|
||||||
|
|
|
@ -11,6 +11,9 @@ repos:
|
||||||
name: origin
|
name: origin
|
||||||
branch: master
|
branch: master
|
||||||
url: "https://github.com/owner/repo.git"
|
url: "https://github.com/owner/repo.git"
|
||||||
|
unmanaged:
|
||||||
|
- LICENSE
|
||||||
|
- README.md
|
||||||
packages:
|
packages:
|
||||||
homesync:
|
homesync:
|
||||||
- $HOME/.homesync.yml
|
- $HOME/.homesync.yml
|
||||||
|
|
|
@ -16,6 +16,9 @@
|
||||||
//! name: origin
|
//! name: origin
|
||||||
//! branch: master
|
//! branch: master
|
||||||
//! url: "https://github.com/owner/repo.git"
|
//! url: "https://github.com/owner/repo.git"
|
||||||
|
//! unmanaged:
|
||||||
|
//! - LICENSE
|
||||||
|
//! - README.md
|
||||||
//! packages:
|
//! packages:
|
||||||
//! homesync:
|
//! homesync:
|
||||||
//! - $HOME/.homesync.yml
|
//! - $HOME/.homesync.yml
|
||||||
|
@ -28,7 +31,13 @@ use super::{path, path::ResPathBuf};
|
||||||
use paris::formatter::colorize_string;
|
use paris::formatter::colorize_string;
|
||||||
use serde_derive::{Deserialize, Serialize};
|
use serde_derive::{Deserialize, Serialize};
|
||||||
use simplelog::{info, paris};
|
use simplelog::{info, paris};
|
||||||
use std::{collections::BTreeMap, env::VarError, error, fmt, fs, io, io::Write, path::PathBuf};
|
use std::{
|
||||||
|
collections::{BTreeMap, HashSet},
|
||||||
|
env::VarError,
|
||||||
|
error, fmt, fs, io,
|
||||||
|
io::Write,
|
||||||
|
path::PathBuf,
|
||||||
|
};
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
// Error
|
// Error
|
||||||
|
@ -124,6 +133,7 @@ pub struct Config {
|
||||||
pub user: User,
|
pub user: User,
|
||||||
pub ssh: SSH,
|
pub ssh: SSH,
|
||||||
pub repos: Repos,
|
pub repos: Repos,
|
||||||
|
pub unmanaged: Option<HashSet<PathBuf>>,
|
||||||
pub packages: BTreeMap<String, Vec<PathBuf>>,
|
pub packages: BTreeMap<String, Vec<PathBuf>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -153,7 +153,14 @@ pub fn stage(pc: &PathConfig) -> Result<()> {
|
||||||
// Find all files in our repository that are no longer being referenced in
|
// Find all files in our repository that are no longer being referenced in
|
||||||
// our primary config file. They should be removed from the repository.
|
// our primary config file. They should be removed from the repository.
|
||||||
for repo_file in &repo_files {
|
for repo_file in &repo_files {
|
||||||
if !package_lookup.contains_key(repo_file.unresolved()) {
|
let unresolved = repo_file.unresolved();
|
||||||
|
if !package_lookup.contains_key(unresolved)
|
||||||
|
&& !pc
|
||||||
|
.config
|
||||||
|
.unmanaged
|
||||||
|
.as_ref()
|
||||||
|
.map_or(false, |m| m.contains(unresolved))
|
||||||
|
{
|
||||||
fs::remove_file(repo_file.resolved())?;
|
fs::remove_file(repo_file.resolved())?;
|
||||||
}
|
}
|
||||||
if let Some(p) = repo_file.resolved().parent() {
|
if let Some(p) = repo_file.resolved().parent() {
|
||||||
|
|
25
src/git.rs
25
src/git.rs
|
@ -9,9 +9,7 @@ use git2::{
|
||||||
StashFlags,
|
StashFlags,
|
||||||
};
|
};
|
||||||
use simplelog::{info, paris, warn};
|
use simplelog::{info, paris, warn};
|
||||||
use std::{
|
use std::{collections::HashSet, env::VarError, error, fmt, io, path::Path, result};
|
||||||
collections::HashSet, env::VarError, error, fmt, fs::File, io, io::Write, path::Path, result,
|
|
||||||
};
|
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
// Error
|
// Error
|
||||||
|
@ -140,24 +138,6 @@ pub fn init(pc: &PathConfig) -> Result<Repository> {
|
||||||
// Syncing
|
// Syncing
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|
||||||
fn create_readme(repo: &Repository) -> Result<()> {
|
|
||||||
let workdir = repo.workdir().ok_or(Error::InvalidBareRepo)?;
|
|
||||||
|
|
||||||
let mut readme = workdir.to_path_buf();
|
|
||||||
readme.push("README.md");
|
|
||||||
|
|
||||||
let mut file = File::create(&readme)?;
|
|
||||||
// TODO(jrpotter): Get the name of the remote repository.
|
|
||||||
file.write_all(
|
|
||||||
"# home-config\n\nThis repository is maintained by \
|
|
||||||
[homesync](https://github.com/jrpotter/homesync)."
|
|
||||||
.as_ref(),
|
|
||||||
)?;
|
|
||||||
info!("Generated new <cyan>README.md</> file.");
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Take the current state of the local repository and push changes to the
|
/// Take the current state of the local repository and push changes to the
|
||||||
/// remote.
|
/// remote.
|
||||||
///
|
///
|
||||||
|
@ -171,7 +151,6 @@ pub fn push(pc: &PathConfig, repo: &mut Repository) -> Result<()> {
|
||||||
|
|
||||||
let refspec = format!("refs/heads/{}", &pc.config.repos.remote.branch);
|
let refspec = format!("refs/heads/{}", &pc.config.repos.remote.branch);
|
||||||
repo.set_head(&refspec)?;
|
repo.set_head(&refspec)?;
|
||||||
create_readme(repo)?;
|
|
||||||
|
|
||||||
// The index corresponds to our staging area. We add all files and write out
|
// The index corresponds to our staging area. We add all files and write out
|
||||||
// to a tree. The resulting tree can be found using `git ls-tree <oid>`.
|
// to a tree. The resulting tree can be found using `git ls-tree <oid>`.
|
||||||
|
@ -498,7 +477,7 @@ fn get_push_options(pc: &PathConfig) -> Result<PushOptions> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================
|
// ========================================
|
||||||
// Miscellaneous
|
// Utility
|
||||||
// ========================================
|
// ========================================
|
||||||
|
|
||||||
fn now_signature(pc: &PathConfig) -> Result<Signature> {
|
fn now_signature(pc: &PathConfig) -> Result<Signature> {
|
||||||
|
|
Loading…
Reference in New Issue