// SyncDir sync directory files to syncer's directory func (s *Syncer) SyncDir(dir string, opt *DirOption) error { if !com.IsDir(dir) { return nil } var ( relFile string dstFile string ) return filepath.Walk(dir, func(p string, info os.FileInfo, err error) error { if err != nil { return err } if info.IsDir() { return nil } if opt != nil && opt.Filter != nil { if !opt.Filter(p) { return nil } } relFile, _ = filepath.Rel(dir, p) if opt != nil { if len(opt.Ignore) > 0 { for _, ignore := range opt.Ignore { if strings.HasPrefix(relFile, ignore) { return nil } } } if opt.Prefix != "" { relFile = filepath.Join(opt.Prefix, relFile) } } dstFile = filepath.Join(s.dir, relFile) if com.IsFile(dstFile) { hash1, _ := helper.Md5File(p) hash2, _ := helper.Md5File(dstFile) if hash1 == hash2 { log15.Debug("Sync|Keep|%s", dstFile) s.SetSynced(dstFile) return nil } } os.MkdirAll(filepath.Dir(dstFile), os.ModePerm) if err := com.Copy(p, dstFile); err != nil { return err } log15.Debug("Sync|Write|%s", dstFile) s.SetSynced(dstFile) return nil }) }
func Load(cfgPath string) (err error) { c := &Config if !sh.Test("file", cfgPath) { com.Copy(cfgPath+".default", cfgPath) } if err = gcfg.ReadFileInto(c, cfgPath); err != nil { return err } if c.Server.RootUrl == "" { c.Server.RootUrl = fmt.Sprintf("http://%s:%d", c.Server.Domain, c.Server.Port) } return }
func (e *Event) packTarget(srcPath, name, destDir string, target setting.Target) (err error) { binName := name if target.GOOS == "windows" { binName += ".exe" } if err = os.MkdirAll(destDir, os.ModePerm); err != nil { return err } targetPath := path.Join(destDir, name+"_"+e.targetString(target)) log.Debug("Packing target to: %s", targetPath) if err = os.RemoveAll(targetPath); err != nil { return err } zipPath := targetPath + ".zip" packPath := path.Join(targetPath, name) if err = os.MkdirAll(packPath, os.ModePerm); err != nil { return err } if err = os.Rename(path.Join(srcPath, binName), path.Join(packPath, binName)); err != nil { return err } // Pack resources. for _, resName := range setting.Resources { resPath := path.Join(srcPath, resName) destPath := path.Join(packPath, resName) if com.IsDir(resPath) { err = com.CopyDir(resPath, destPath) } else { err = com.Copy(resPath, destPath) } if err != nil { return err } } if err = zip.PackTo(targetPath, zipPath); err != nil { return err } os.RemoveAll(targetPath) return nil }
// copy extra files func (b *Builder) copyExtraAssets(ctx *Context) { staticDir := ctx.Theme.Static() assetFiles := []string{"favicon.ico", "robots.txt"} for _, f := range assetFiles { srcFile := path.Join(b.opt.SrcDir, f) if !com.IsFile(srcFile) { srcFile = path.Join(staticDir, f) } if !com.IsFile(srcFile) { continue } toFile := path.Join(ctx.DstDir, f) if err := com.Copy(srcFile, toFile); err != nil { ctx.Error = err return } ctx.Diff.Add(toFile, DIFF_ADD, time.Now()) } }
// InitRepository initializes README and .gitignore if needed. func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { repoPath := RepoPath(user.Name, repo.Name) // Create bare new repository. if err := extractGitBareZip(repoPath); err != nil { return err } rp := strings.NewReplacer("\\", "/", " ", "\\ ") // hook/post-update if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), fmt.Sprintf("#!/usr/bin/env %s\n%s update $1 $2 $3\n", base.ScriptType, rp.Replace(appPath))); err != nil { return err } // Initialize repository according to user's choice. fileName := map[string]string{} if initReadme { fileName["readme"] = "README.md" } if repoLang != "" { fileName["gitign"] = ".gitignore" } if license != "" { fileName["license"] = "LICENSE" } // Clone to temprory path and do the init commit. tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond())) os.MkdirAll(tmpDir, os.ModePerm) _, stderr, err := com.ExecCmd("git", "clone", repoPath, tmpDir) if err != nil { return errors.New("git clone: " + stderr) } // README if initReadme { defaultReadme := repo.Name + "\n" + strings.Repeat("=", utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description if err := ioutil.WriteFile(filepath.Join(tmpDir, fileName["readme"]), []byte(defaultReadme), 0644); err != nil { return err } } // .gitignore if repoLang != "" { filePath := "conf/gitignore/" + repoLang if com.IsFile(filePath) { if err := com.Copy(filePath, filepath.Join(tmpDir, fileName["gitign"])); err != nil { return err } } } // LICENSE if license != "" { filePath := "conf/license/" + license if com.IsFile(filePath) { if err := com.Copy(filePath, filepath.Join(tmpDir, fileName["license"])); err != nil { return err } } } if len(fileName) == 0 { return nil } SetRepoEnvs(user.Id, user.Name, repo.Name) // Apply changes and commit. return initRepoCommit(tmpDir, user.NewGitSig()) }
// InitRepository initializes README and .gitignore if needed. func initRepository(e Engine, repoPath string, u *User, repo *Repository, initReadme bool, repoLang, license string) error { // Somehow the directory could exist. if com.IsExist(repoPath) { return fmt.Errorf("initRepository: path already exists: %s", repoPath) } // Init bare new repository. os.MkdirAll(repoPath, os.ModePerm) _, stderr, err := process.ExecDir(-1, repoPath, fmt.Sprintf("initRepository(git init --bare): %s", repoPath), "git", "init", "--bare") if err != nil { return fmt.Errorf("git init --bare: %s", err) } if err := createUpdateHook(repoPath); err != nil { return err } // Initialize repository according to user's choice. fileName := map[string]string{} if initReadme { fileName["readme"] = "README.md" } if repoLang != "" { fileName["gitign"] = ".gitignore" } if license != "" { fileName["license"] = "LICENSE" } // Clone to temprory path and do the init commit. tmpDir := filepath.Join(os.TempDir(), com.ToStr(time.Now().Nanosecond())) os.MkdirAll(tmpDir, os.ModePerm) defer os.RemoveAll(tmpDir) _, stderr, err = process.Exec( fmt.Sprintf("initRepository(git clone): %s", repoPath), "git", "clone", repoPath, tmpDir) if err != nil { return errors.New("git clone: " + stderr) } // README if initReadme { defaultReadme := repo.Name + "\n" + strings.Repeat("=", utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description if err := ioutil.WriteFile(filepath.Join(tmpDir, fileName["readme"]), []byte(defaultReadme), 0644); err != nil { return err } } // FIXME: following two can be merged. // .gitignore // Copy custom file when available. customPath := path.Join(setting.CustomPath, "conf/gitignore", repoLang) targetPath := path.Join(tmpDir, fileName["gitign"]) if com.IsFile(customPath) { if err := com.Copy(customPath, targetPath); err != nil { return fmt.Errorf("copy gitignore: %v", err) } } else if com.IsSliceContainsStr(Gitignores, repoLang) { if err = ioutil.WriteFile(targetPath, bindata.MustAsset(path.Join("conf/gitignore", repoLang)), 0644); err != nil { return fmt.Errorf("generate gitignore: %v", err) } } else { delete(fileName, "gitign") } // LICENSE customPath = path.Join(setting.CustomPath, "conf/license", license) targetPath = path.Join(tmpDir, fileName["license"]) if com.IsFile(customPath) { if err = com.Copy(customPath, targetPath); err != nil { return fmt.Errorf("copy license: %v", err) } } else if com.IsSliceContainsStr(Licenses, license) { if err = ioutil.WriteFile(targetPath, bindata.MustAsset(path.Join("conf/license", license)), 0644); err != nil { return fmt.Errorf("generate license: %v", err) } } else { delete(fileName, "license") } if len(fileName) == 0 { // Re-fetch the repository from database before updating it (else it would // override changes that were done earlier with sql) if repo, err = getRepositoryById(e, repo.Id); err != nil { return err } repo.IsBare = true repo.DefaultBranch = "master" return updateRepository(e, repo, false) } // Apply changes and commit. return initRepoCommit(tmpDir, u.NewGitSig()) }
// InitRepository initializes README and .gitignore if needed. func initRepository(f string, u *User, repo *Repository, initReadme bool, repoLang, license string) error { repoPath := RepoPath(u.Name, repo.Name) // Create bare new repository. if err := extractGitBareZip(repoPath); err != nil { return err } // hook/post-update if err := createHookUpdate(filepath.Join(repoPath, "hooks", "update"), fmt.Sprintf(TPL_UPDATE_HOOK, setting.ScriptType, "\""+appPath+"\"")); err != nil { return err } // Initialize repository according to user's choice. fileName := map[string]string{} if initReadme { fileName["readme"] = "README.md" } if repoLang != "" { fileName["gitign"] = ".gitignore" } if license != "" { fileName["license"] = "LICENSE" } // Clone to temprory path and do the init commit. tmpDir := filepath.Join(os.TempDir(), com.ToStr(time.Now().Nanosecond())) os.MkdirAll(tmpDir, os.ModePerm) _, stderr, err := process.Exec( fmt.Sprintf("initRepository(git clone): %s", repoPath), "git", "clone", repoPath, tmpDir) if err != nil { return errors.New("initRepository(git clone): " + stderr) } // README if initReadme { defaultReadme := repo.Name + "\n" + strings.Repeat("=", utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description if err := ioutil.WriteFile(filepath.Join(tmpDir, fileName["readme"]), []byte(defaultReadme), 0644); err != nil { return err } } // .gitignore filePath := "conf/gitignore/" + repoLang if com.IsFile(filePath) { targetPath := path.Join(tmpDir, fileName["gitign"]) if com.IsFile(filePath) { if err = com.Copy(filePath, targetPath); err != nil { return err } } else { // Check custom files. filePath = path.Join(setting.CustomPath, "conf/gitignore", repoLang) if com.IsFile(filePath) { if err := com.Copy(filePath, targetPath); err != nil { return err } } } } else { delete(fileName, "gitign") } // LICENSE filePath = "conf/license/" + license if com.IsFile(filePath) { targetPath := path.Join(tmpDir, fileName["license"]) if com.IsFile(filePath) { if err = com.Copy(filePath, targetPath); err != nil { return err } } else { // Check custom files. filePath = path.Join(setting.CustomPath, "conf/license", license) if com.IsFile(filePath) { if err := com.Copy(filePath, targetPath); err != nil { return err } } } } else { delete(fileName, "license") } if len(fileName) == 0 { repo.IsBare = true repo.DefaultBranch = "master" return UpdateRepository(repo) } // Apply changes and commit. return initRepoCommit(tmpDir, u.NewGitSig()) }
func (repo *Repository) UploadRepoFiles(doer *User, opts UploadRepoFileOptions) (err error) { if len(opts.Files) == 0 { return nil } uploads, err := GetUploadsByUUIDs(opts.Files) if err != nil { return fmt.Errorf("GetUploadsByUUIDs [uuids: %v]: %v", opts.Files, err) } repoWorkingPool.CheckIn(com.ToStr(repo.ID)) defer repoWorkingPool.CheckOut(com.ToStr(repo.ID)) if err = repo.DiscardLocalRepoBranchChanges(opts.OldBranch); err != nil { return fmt.Errorf("DiscardLocalRepoBranchChanges [branch: %s]: %v", opts.OldBranch, err) } else if err = repo.UpdateLocalCopyBranch(opts.OldBranch); err != nil { return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err) } if opts.OldBranch != opts.NewBranch { if err = repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil { return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err) } } localPath := repo.LocalCopyPath() dirPath := path.Join(localPath, opts.TreePath) os.MkdirAll(dirPath, os.ModePerm) // Copy uploaded files into repository. for _, upload := range uploads { tmpPath := upload.LocalPath() targetPath := path.Join(dirPath, upload.Name) if !com.IsFile(tmpPath) { continue } if err = com.Copy(tmpPath, targetPath); err != nil { return fmt.Errorf("Copy: %v", err) } } if err = git.AddChanges(localPath, true); err != nil { return fmt.Errorf("git add --all: %v", err) } else if err = git.CommitChanges(localPath, git.CommitChangesOptions{ Committer: doer.NewGitSig(), Message: opts.Message, }); err != nil { return fmt.Errorf("CommitChanges: %v", err) } else if err = git.Push(localPath, "origin", opts.NewBranch); err != nil { return fmt.Errorf("git push origin %s: %v", opts.NewBranch, err) } gitRepo, err := git.OpenRepository(repo.RepoPath()) if err != nil { log.Error(4, "OpenRepository: %v", err) return nil } commit, err := gitRepo.GetBranchCommit(opts.NewBranch) if err != nil { log.Error(4, "GetBranchCommit [branch: %s]: %v", opts.NewBranch, err) return nil } // Simulate push event. pushCommits := &PushCommits{ Len: 1, Commits: []*PushCommit{CommitToPushCommit(commit)}, } if err := CommitRepoAction(CommitRepoActionOptions{ PusherName: doer.Name, RepoOwnerID: repo.MustOwner().ID, RepoName: repo.Name, RefFullName: git.BRANCH_PREFIX + opts.NewBranch, OldCommitID: opts.LastCommitID, NewCommitID: commit.ID.String(), Commits: pushCommits, }); err != nil { log.Error(4, "CommitRepoAction: %v", err) return nil } return DeleteUploads(uploads...) }
// InitRepository initializes README and .gitignore if needed. func initRepository(f string, user *User, repo *Repository, initReadme bool, repoLang, license string) error { repoPath := RepoPath(user.Name, repo.Name) // Create bare new repository. if err := extractGitBareZip(repoPath); err != nil { return err } // hook/post-update pu, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-update"), os.O_CREATE|os.O_WRONLY, 0777) if err != nil { return err } defer pu.Close() // TODO: Windows .bat if _, err = pu.WriteString(fmt.Sprintf("#!/usr/bin/env bash\n%s update\n", appPath)); err != nil { return err } // hook/post-update pu2, err := os.OpenFile(filepath.Join(repoPath, "hooks", "post-receive"), os.O_CREATE|os.O_WRONLY, 0777) if err != nil { return err } defer pu2.Close() // TODO: Windows .bat if _, err = pu2.WriteString("#!/usr/bin/env bash\ngit update-server-info\n"); err != nil { return err } // Initialize repository according to user's choice. fileName := map[string]string{} if initReadme { fileName["readme"] = "README.md" } if repoLang != "" { fileName["gitign"] = ".gitignore" } if license != "" { fileName["license"] = "LICENSE" } // Clone to temprory path and do the init commit. tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond())) os.MkdirAll(tmpDir, os.ModePerm) if _, _, err := com.ExecCmd("git", "clone", repoPath, tmpDir); err != nil { return err } // README if initReadme { defaultReadme := repo.Name + "\n" + strings.Repeat("=", utf8.RuneCountInString(repo.Name)) + "\n\n" + repo.Description if err := ioutil.WriteFile(filepath.Join(tmpDir, fileName["readme"]), []byte(defaultReadme), 0644); err != nil { return err } } // .gitignore if repoLang != "" { filePath := "conf/gitignore/" + repoLang if com.IsFile(filePath) { if _, err := com.Copy(filePath, filepath.Join(tmpDir, fileName["gitign"])); err != nil { return err } } } // LICENSE if license != "" { filePath := "conf/license/" + license if com.IsFile(filePath) { if _, err := com.Copy(filePath, filepath.Join(tmpDir, fileName["license"])); err != nil { return err } } } if len(fileName) == 0 { return nil } // Apply changes and commit. if err := initRepoCommit(tmpDir, user.NewGitSig()); err != nil { return err } return nil }