public int Get(FileMetaData file)
        {
            int output;

            if (!wordCountCache.TryGetValue(file, out output))
            {
                output = UDNFilesHelper.GetWordCount(UDNFilesHelper.Get(file));
                wordCountCache.Add(file, output);
            }

            return(output);
        }
Esempio n. 2
0
        private static string[] DetectLocalizationLanguages(IEnumerable <FileMetaData> files)
        {
            var langs = new HashSet <string>();

            foreach (var file in files)
            {
                string prefix;
                string lang;
                string postfix;

                UDNFilesHelper.SplitByLang(file.DepotPath.Path, out prefix, out lang, out postfix);

                if (!string.IsNullOrWhiteSpace(lang) && lang.ToUpper() != "INT" && !langs.Contains(lang.ToUpper()))
                {
                    langs.Add(lang.ToUpper());
                }
            }

            return(langs.ToArray());
        }
Esempio n. 3
0
        static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                Console.Out.WriteLine("Usage TranslatedWordsCountEstimator <report CSV file> [<p4 server address> <user name> <workspace name> [<password>]]");
                return;
            }

            try
            {
                var reportFilePath = args[0];
                var p4Port         = GetP4Setting(args, 1, P4Setting.P4PORT);
                var p4User         = GetP4Setting(args, 2, P4Setting.P4USER);
                var p4Workspace    = GetP4Setting(args, 3, P4Setting.P4CLIENT);

                Console.Out.Write("Connecting to P4 ");
                var p4Server     = new Server(new ServerAddress(p4Port));
                var p4Repository = new Repository(p4Server);
                var p4Connection = p4Repository.Connection;

                p4Connection.UserName = p4User;

                p4Connection.Client = new Client {
                    Name = p4Workspace
                };

                p4Connection.Connect(null);

                if (args.Length >= 5)
                {
                    p4Connection.Login(args[4]);
                }

                Console.WriteLine("[done]");

                Console.Out.Write("Getting latest changelist: ");
                var latestChangelist = p4Repository.GetChangelists(new Options {
                    { "-m", "1" }
                }).First();
                Console.Out.WriteLine(latestChangelist.Id);

                var currentDate = DateTime.Now;

                // detect depot based on EXE path
                string DepotPath = DefaultDepotPath;
                IList <FileMetaData> ExeMetaData = p4Repository.GetFileMetaData(new Options(), new FileSpec(null, new ClientPath(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0].FullyQualifiedName), null, null));
                if (ExeMetaData.Count > 0)
                {
                    string Path = ExeMetaData[0].DepotPath.ToString();
                    int    i    = Path.IndexOf("/Engine/Binaries");
                    if (i != -1)
                    {
                        DepotPath = Path.Substring(0, i);
                    }
                }

                string DocumentationDepotPath = DepotPath + DefaultDocumentationPath;
                var    filesSpec = new List <FileSpec> {
                    new FileSpec(
                        new DepotPath(DocumentationDepotPath),
                        new ChangelistIdVersion(latestChangelist.Id))
                };

                Console.Out.Write("Synchronizing " + DocumentationDepotPath);
                p4Connection.Client.SyncFiles(filesSpec, null);
                Console.Out.WriteLine("[done]");

                Console.Out.Write("Getting files info ");
                var files = p4Repository.GetFileMetaData(filesSpec, null).Where(md => !ExcludedAction(md.HeadAction)).ToList();
                Console.Out.WriteLine("[done]");

                var locLangs = DetectLocalizationLanguages(files);
                Console.Out.WriteLine("Found languages: [{0}]", string.Join(", ", locLangs));

                Console.Out.Write("Counting total words: ");
                var intFiles     = files.Where(f => f.DepotPath.Path.ToLower().EndsWith(".int.udn")).ToList();
                var intWordCount = new WordCountCache();
                var totalWords   = (double)intFiles.Sum(intFile => intWordCount.Get(intFile));
                Console.Out.WriteLine(totalWords);

                var data = new Dictionary <string, double> {
                    { "int", totalWords }
                };

                foreach (var lang in locLangs)
                {
                    var locFiles =
                        files.Where(f => f.DepotPath.Path.ToLower().EndsWith("." + lang.ToLower() + ".udn")).ToList();
                    var wordCount = totalWords;

                    Console.Out.Write("Calculating {0} language: ", lang, 0);

                    foreach (var intFile in intFiles)
                    {
                        var filteredLocFiles =
                            locFiles.Where(
                                file =>
                                file.DepotPath.Path.ToLower() == UDNFilesHelper.ChangeLanguage(intFile.DepotPath.Path, lang.ToUpper()).ToLower())
                            .ToArray();

                        if (filteredLocFiles.Count() != 1)
                        {
                            wordCount -= intWordCount.Get(intFile);
                            continue;
                        }

                        var locFile = filteredLocFiles[0];

                        var match = ChangelistNumberPattern.Match(UDNFilesHelper.Get(locFile));
                        IList <DepotFileDiff> diffs = null;

                        DateTime?diffDate = null;

                        if (match.Success)
                        {
                            var cl = int.Parse(match.Groups["number"].Value);
                            if (cl == 0)
                            {
                                wordCount -= intWordCount.Get(intFile);
                                continue;
                            }
                            if (intFile.HeadChange > cl)
                            {
                                diffDate = p4Repository.GetChangelist(cl).ModifiedDate;
                            }
                        }
                        else
                        {
                            if (intFile.HeadTime > locFile.HeadTime)
                            {
                                diffDate = locFile.HeadTime;
                            }
                        }

                        if (!diffDate.HasValue)
                        {
                            continue;
                        }

                        diffs = p4Repository.GetDepotFileDiffs(
                            string.Format("{0}@{1}", intFile.DepotPath.Path, diffDate.Value.ToString("yyyy\\/MM\\/dd\\:HH\\:mm\\:ss")),
                            new FileSpec(intFile.DepotPath, new ChangelistIdVersion(latestChangelist.Id)).ToString(),
                            new Options()
                        {
                            { "-d", "" }, { "-u", "" }
                        });

                        if (diffs != null && diffs[0] != null && string.IsNullOrEmpty(diffs[0].LeftFile.DepotPath.Path))
                        {
                            PathSpec P4Loc = TraceP4Location(p4Repository, new FileSpec(intFile.DepotPath, new ChangelistIdVersion(latestChangelist.Id)), diffDate.Value);
                            // some wired case which the ModifiedDate for intFile from locFile's Changelist pattern is earlier than the first version Date.
                            // maybe caused by server time adjustment.
                            if (P4Loc == null)
                            {
                                continue;
                            }
                            diffs = p4Repository.GetDepotFileDiffs(
                                string.Format("{0}@{1}", P4Loc, diffDate.Value.ToString("yyyy\\/MM\\/dd\\:HH\\:mm\\:ss")),
                                new FileSpec(intFile.DepotPath, new ChangelistIdVersion(latestChangelist.Id)).ToString(),
                                new Options()
                            {
                                { "-d", "" }, { "-u", "" }
                            });
                        }

                        if (diffs[0].Type == DiffType.Identical)
                        {
                            continue;
                        }

                        var lines = diffs[0].Diff.Split('\n');

                        var addedWords   = UDNFilesHelper.GetWordCount(string.Join("\n", lines.Where(l => l.StartsWith(">"))));
                        var removedWords = UDNFilesHelper.GetWordCount(string.Join("\n", lines.Where(l => l.StartsWith("<"))));

                        wordCount -= addedWords;
                        wordCount -= 0.05 * removedWords;
                    }

                    Console.Out.Write("{1:0.00}\n", lang, wordCount);
                    data.Add(lang.ToLower(), wordCount);
                }

                p4Connection.Disconnect(null);

                var reportFile = new ReportFile(reportFilePath);
                reportFile.AppendData(currentDate, data);
                reportFile.Save();
            }
            catch (InvalidCastException e)
            {
                Console.Error.WriteLine("Unrecognized error: {0}\nCall stack: {1}\n", e.Message, e.StackTrace);
            }
        }